package futbol.tacticas.concursantes2007.SeteTeam.jugadores.facklab;

import futbol.tacticas.concursantes2007.SeteTeam.*;
import futbol.tacticas.concursantes2007.SeteTeam.jugadores.AbstractTacticaJugador;
import futbol.tacticas.concursantes2007.SeteTeam.jugadores.geometria.Linea;

import java.awt.Point;
import java.util.Vector;

import futbol.tacticas.Comando;


/**
 * Tactica simple para un portero
 * 
 * @author llua
 *
 */
public class TacticaPortero extends AbstractTacticaJugador {

	
	public TacticaPortero(final int yInicial, final int fuerza, final Entrenador entrenador) {
		super(Entrenador.PORTERO, -160, yInicial, fuerza, entrenador);
	}

	protected void generarMovimiento(final Vector<Comando> comandos) {
		final Point bola = getSituacion().getBola(); 
		final Point proyeccionBola = getEntrenador().getProyeccionBola();
		final double distYoBola = getPosicion().distance(bola);
		Point posicionPortero;
		
		if(isJugadorMasCercanoBola() && (bola.y >30 || bola.y <-30)){
			posicionPortero = bola;
		}if(proyeccionBola!=null && proyeccionBola.x==-160 && proyeccionBola.y <30 && proyeccionBola.y >-30){
			final Linea linea = new Linea(proyeccionBola,bola);
			if(linea!=null && !Double.isInfinite(linea.getM())){
				posicionPortero = new Point(proyeccionBola.x+10,linea.calcularY(proyeccionBola.x+10).y);
			}else{
				posicionPortero = proyeccionBola;
			}
		}else{
			int y = (int)bola.getX();
			if(y>30)y=20;
			if(y<-30)y=-20;
			posicionPortero = new Point(-160,0);
			
			final Linea linea = new Linea(posicionPortero,bola);
			if(linea!=null && !Double.isInfinite(linea.getM())){
				posicionPortero = new Point(posicionPortero.x+12,linea.calcularY(posicionPortero.x+12).y);
			}
		}
		/*//Calculo la distancia del portero a la proyeccion bola
		if(getEntrenador().getProyeccionBola() != null 
				&& getEntrenador().getProyeccionBola().x==-160
				&& !(getEntrenador().getProyeccionBola().y<-30
				|| getEntrenador().getProyeccionBola().y>30)){
			
			final Point pBola=getEntrenador().getProyeccionBola();
			final Linea lineaBola = getEntrenador().getLineaBola();
			
			if(lineaBola!=null){
				//Calculo la distancia del portero a la proyeccion bola
				final double distPorteroBola = pBola.distance(bola);
				
				//Calculo la proyeccion entre el portero y la linea de la bola
				final Point pPorteroLinea =  lineaBola.calcularProyeccionPerpendicular(getPosicion());
			
				if(pPorteroLinea==null){
					posicionPortero = pBola;
				}else{
					//Calculo la distancia del portero a la linea de la bola
					final double distPorteroLinea =  pPorteroLinea.distance(getPosicion());
	
					if(distPorteroBola>distPorteroLinea){
						posicionPortero = pPorteroLinea;
					}else{
						posicionPortero = bola;
					}
				}
			}else{				
				int y = (int)bola.getX();
				if(y>30)y=20;
				if(y<-30)y=-20;
				
				posicionPortero = new Point(-160,y);
			}
		}else{
			int y = (int)bola.getX();
			if(y>30)y=20;
			if(y<-30)y=-20;
			
			posicionPortero = new Point(-160,y);
		}*/
		
		comandos.add(irA(posicionPortero.getX(),posicionPortero.getY()));
	}

	protected void generarAccion(final Vector<Comando> comandos) {
		Point[] mi_Equipo = getSituacion().getMisJugadores();

		int solucion = Entrenador.DEF_BAJO;
		int min = Densidad_Jugadores(getPosicion(), mi_Equipo[5]);;
		
		for(int i=Entrenador.DEF_BAJO;i<=Entrenador.CEN_MED_BAJO;i++){
			if(i!=2 && i!=3 && i!=5){
				int temp = Densidad_Jugadores(getPosicion(), mi_Equipo[i]);
				if ((min > temp) && mi_Equipo[i].x>getPosicion().x && mi_Equipo[i].distance(mi_Equipo[getNumero()])>60){
					min=temp;
					solucion=i;
				}
			}
		}
		if(getSituacion().getContrario()[10].x<50 || getSituacion().getContrario()[9].x<50){
			comandos.add(golpearBola(0, 0));
		}else {
			comandos.add(pase(solucion));
		}
		
	}
}
